题意:小$ L $有一座环形花园,沿花园的顺时针方向,他把各个花圃编号为 $1 \sim n$。花园 $1$ 和 $n$ 是相邻的。
他的环形花园每天都会换一个新花样,但他的花园都不外乎一个规则:任意相邻 $m$ 个花圃中都只有不超过 $k$ 个 C 形的花圃,其余花圃均为 P 形的花圃。
例如,若 $n=10$ , $m=5$ , $k=3$ ,则
CCPCPPPPCC
是一种不符合规则的花圃。CCPPPPCPCP
是一种符合规则的花圃。
请帮小 L 求出符合规则的花园种数对 $10^9+7$ 取模的结果。
$2 \leq n \le 10^{15}$,$2 \leq m \leq \min(n, 5)$,$1 \leq k \lt m$。
我们用一个$m$位二进制数表示后$m$个花圃的状态,$1$表示为$M$.
那么令$f[i][j]$表示由状态$i$转移到状态$j$的方案数($i$和$j$都合法,即1的个数不超过$k$)。($Floyd$矩阵)
所谓转移,是指如果$i$表示第$1$~$m$个花圃的状态,那么$j$代表第$2$~第$m+1$个花圃的状态。
那么怎么求得$f[i][j]$呢?
枚举一个长度为$m-1$的状态,在它前面加$0/1$即是$i$,在它后面加$0/1$即是$j$,在过程中判断$1$的个数会不会超过$k$即可。
由于是个环,所以实质上有$n+m$个花圃,第$n+1~n+m$个花圃就相当于第$1~m$个花圃,所以我们求的答案就是一个合法状态转移$n$次,转移回原状态的方案数之和。
1 |
|